#ifndef _WX_MENUITEM_H_BASE_
#define _WX_MENUITEM_H_BASE_

#include "wx/defs.h"
#include "wx/object.h"

class wxAcceleratorEntry;
class wxMenuItem;
class wxMenu;

class wxMenuItemBase : public wxObject {
  public:
    static wxMenuItem *New( wxMenu *parentMenu = ( wxMenu * )NULL,int itemid = wxID_SEPARATOR,
                            const wxString& text = wxEmptyString,const wxString& help = wxEmptyString,
                            wxItemKind kind = wxITEM_NORMAL,wxMenu *subMenu = ( wxMenu * )NULL );
    virtual ~wxMenuItemBase();
    wxMenu *GetMenu() const { return m_parentMenu; }
    void SetMenu( wxMenu* menu ) { m_parentMenu = menu; }
    void SetId( int itemid ) { m_id = itemid; }
    int  GetId() const { return m_id; }
    bool IsSeparator() const { return m_id == wxID_SEPARATOR; }
    virtual void SetText( const wxString& str );
    wxString GetLabel() const { return GetLabelFromText( m_text ); }
    const wxString& GetText() const { return m_text; }
    static wxString GetLabelFromText( const wxString& text );
    wxItemKind GetKind() const { return m_kind; }
    void SetKind( wxItemKind kind ) { m_kind = kind; }
    virtual void SetCheckable( bool checkable ) { m_kind = checkable ? wxITEM_CHECK : wxITEM_NORMAL; }
    bool IsCheckable() const{ return m_kind == wxITEM_CHECK || m_kind == wxITEM_RADIO; }
    bool IsSubMenu() const { return m_subMenu != NULL; }
    void SetSubMenu( wxMenu *menu ) { m_subMenu = menu; }
    wxMenu *GetSubMenu() const { return m_subMenu; }
    virtual void Enable( bool enable = true ) { m_isEnabled = enable; }
    virtual bool IsEnabled() const { return m_isEnabled; }
    virtual void Check( bool check = true ) { m_isChecked = check; }
    virtual bool IsChecked() const { return m_isChecked; }
    void Toggle() { Check( !m_isChecked ); }
    void SetHelp( const wxString& str );
    const wxString& GetHelp() const { return m_help; }
    static wxAcceleratorEntry *GetAccelFromString( const wxString& label );
    virtual wxAcceleratorEntry *GetAccel() const;
    virtual void SetAccel( wxAcceleratorEntry *accel );
    void SetName( const wxString& str ) { SetText( str ); }
    const wxString& GetName() const { return GetText(); }

    static wxMenuItem *New( wxMenu *parentMenu,int itemid,const wxString& text,const wxString& help,
                            bool isCheckable,wxMenu *subMenu = ( wxMenu * )NULL ) {
      return New( parentMenu, itemid, text, help,isCheckable ? wxITEM_CHECK : wxITEM_NORMAL, subMenu );
    }

  protected:
    int           m_id;
    wxMenu       *m_parentMenu,*m_subMenu;
    wxString      m_text,m_help;
    wxItemKind    m_kind;
    bool          m_isChecked;
    bool          m_isEnabled;
    wxMenuItemBase( wxMenu *parentMenu = ( wxMenu * )NULL,int itemid = wxID_SEPARATOR,
                    const wxString& text = wxEmptyString,const wxString& help = wxEmptyString,
                    wxItemKind kind = wxITEM_NORMAL,wxMenu *subMenu = ( wxMenu * )NULL );
  private:
    wxMenuItemBase( const wxMenuItemBase& item );
    wxMenuItemBase& operator=( const wxMenuItemBase& item );

  public:

    void SetItemLabel( const wxString& str ) { SetText( str ); }
    wxString GetItemLabelText() const { return GetLabelText( m_text ); }
    static wxString GetLabelText( const wxString& label );
};

#ifdef wxUSE_BASE_CLASSES_ONLY
#define wxMenuItem wxMenuItemBase
#else
#include "wx/gtk/menuitem.h"
#endif

#endif

